23

» WarCraft 3 / как сделать такой инвентарь?

Похожие вопросы:

ответ
Недавно был такой вопрос.
Перескажу, хоть и не поощряю вопросов, заданных без предварительного долгого лурка.
Легче всего реализуется через использование "уровня предмета" как категории и последующей триггерной проверки, чтобы в инвентаре не было двух предметов одного уровня (цикл+условие).
От себя добавлю, что можно создать предметы-болванки на каждый тип предмета, которые нельзя выбросить. Удалять их при поднятии предмета соответствующего типа (уровня) и добавлять при его выбрасывании (то же цикл+условие, только событие другое.)
ответ
отменять постройку юнита если технология уже ап
либо как сразу говорили через ап здания
где каждому твоему зданию будет соответствовать такое же здание но с дополнительным слотом
с продажей юнита открываешь доту и смотришь как там сделан спелл передать предметы у куры
он сделан как раз через продажу юнита
иначе никак
если не нравится пожалуйся богу об этом
или близардам
пусть выпустят новый патч специально для тебя
ответ
Сделать триггер для проверки кода, ну и организовать систему для его считывания и поверь это очень много всего, придется продумать.
Если коротко ты цифрами будешь (условно) сохранять своего героя, каждый набор цифр отвечает за какой то параметр героя, силу, ловкость, уровень, предметы и так далее, когда я говорю что это очень много всего придется продумать так и есть, тебе придется создать базу данных, для всех чисел и все проверять при введении команды, для защиты можно сверять суму чисел и проверять героя за которого играет игрок.
Мой тебе совет, не поленись и вбей в поиск "сделать команду save для карты варкрафт 3", на твое удивление там будет то что тебе нужно, уже на второй ссылке.
ответ
Действие:
Установить количество зарядов предмета = количество зарядов предмета -1.
Если количество зарядов предмета = 0, то удалить предмет.
ответ
Steal nerves:
ответы
Как объединить зелья лечения в одно с зарядом, если герой имеет одно в инвентаре и поднимает второе?
обычно используют "событие - юнит получает предмет", И на предмет, который вы получаете, ссылается переменная, которая называется item being manipulated. А юнит, который получает итем - Triggering Unit. Вы можете с помощью этой переменной итема узнать тип, сравнить. Потом циклом пробегаете по слотам (от 1 до 6), тут вся суть в одной команде триггерной (item in slot X, итем в слоте Х) и проверяете есть ли такой же итем (не забываем делать проверки, на то что этот предмет не равен item being manipulated и сравниваете не одинаковые ли типы). Если есть такой же (находите тот же тип что и item being manipulated), то от item being manipulated берете заряды и прибавляете к зарядам существующего, а потом item being manipulated удаляете. Недостаток: при заполненном инвентаре такая штука не будет работать.Не хватает свободного места.
код
цикл А от 1 до 6
if тип итема (item being manipulated) РАВНО тип итема (item in slot А) and item being manipulated НЕ РАВНО item in slot А then проверяете
set k = Charges remaining in ( item being manipulated) + Charges remaining in ( item in slot А) складываете заряды
Set charges remaining in ( item in slot А) to ( k) устанавливаете кол-во зарядов
Remove Item (item being manipulated) удаляете
endif
Есть гуишная проверка на наличие итема определенного типа в инвентаре, но она утечна. И лучше циклом прогонять.
Кстати выше пример, там вот дропают итем, зачем? чтобы проверить есть ли такой же итем. А то мб проверка на наличие итема определенного типа в инвентаре найти подобранный итем. А нам нужно знать, что есть еще один, кроме подобранного. Поэтому дропают. Только не понятно зачем создаете новый итем.
Проверка, на то что подобранный предмет имеет зарядов больше 0, говорит нам о том что это не обычный предмет.
есть статьи
Как зелье с зарядом разделить, если игрок перекладывает зелье с зарядом в другую ячейку инвентаря, если возможно, то разделение происходить должно только при нажатии какой-то клавиши?
можно перекладывать в другой слот. для этого ловят приказ. Короче смотрите системы CCS
там создают новый такой же предмет, и выделяют кол-во зарядов, деля поровну например. Абилкой например, попробуй сделать целевую активную абилку с целью предмет, указывай на инвентарь и дели.
Как это можно сделать покороче для множества разных типов предметов?
всмысле покороче? сделать под одну группу? есть же классификация. Я вот делаю так, что все предметы, которые с зарядами, должны иметь классификацию "с зарядами". Не помню точно как называется класс итемов.
Как правильно реализовать в инвентаре 7 слот?
если у героя заполнен инвентарь, то он может подобрать руну. Вот в доте система скрещивания. То же самое можно сделать и с зарядами. На земле у него лежат руны, при подборе руна исчезает. Но мы проверяем слоты, есть ли такой итем. Если есть, прибавляем заряды к существующему. Иначе создать новый. При дропе итема, оригинал подменяет снова на руну. В руну можно передать значения зарядов.
А также ограничения какие-то на количество зарядов нужно ставить или сама система выше какой-то планки не даст собирать?
до такого не доходил.
скинул примеры (хотя многие дурацкие, но делал здесь хгм в качестве ответов)
вот еще одна система hh

23

» WarCraft 3 / Как сделать команду кик?

Похожие вопросы:

ответ
Стремись к использованию одного единственного таймера(по крайней мере это пропагандируется с давних пор. конкретных чисел по производительности дать не могу). Каждый тик таймера увеличиваешь целочисленные переменные, выделенные по одной для каждого игрока. По событию отданного приказа обнуляешь эти переменные. Если переменная > скольки-то, предлагаешь прописать сообщение в чат для кика. Правда в дотке там таймер по получению опыта вроде.

23

» WarCraft 3 / как сделать рецепт качнув его за балы ?

Похожие вопросы:

ответ
в статьи
там есть пример создание своего ресурса
ответ
Все намного проще чем Вы думаете. В меню редактора "Сценарий => Дополнительно" есть такая галочка, называется "Скрытые области частично видимы", убери эту галочку и будет тебе магия)
p.s.: Если сразу не включится функция пересохрани карту и перезапусти варик.
ответ
Если охото сделать зарыды со счетчиком то тут 2 пути:
  1. Юзать стандартные абилки со счетчиком зарядов, а их только 2 совы охотницы и вспышки орудийного расчета гномов. Увы первая цель декор онли, вторая цель точка онли, на юнита никак, кстати хорошо подходит под кастом блинки, кастуется почти мгновенно, быстрее канала, без всяких рукомаханий.
  2. Использовать N способностей с разными иконками, на которых будет изображен счетчик, изменяя уровень способности или вовсе весть скилл через 'Eneg' (Техника, скилл механика, позволяет изменять поля скиллов) то можно создать скиллы со счетчиком, допустим пока есть заряды у скилла нету кулдауна, скилл последнего заряда имеет кулдаун.
Увы туча ипорта да и найти качественные иконки со счетчиком дело непростое.
ответ
Какой точный вопрос, однако.
Ответ: триггерно, либо в редакторе объектов, если нужно изменить характеристики, не создаваемые/изменяемые триггерно.
Попытаюсь сыграть в экстрасенса, подстрахуюсь логикой:
Если нужно, чтобы изменялась характеристика количественно, т.е, например, увеличивался наносимый урон, то в действии нанесения урона вместо точного значения нужно выставить функию (формулу, зависимость etc.) имеющую аргументом уровень способности.
Если нужно менять характеристику качественно, например, тип наносимого урона, то следует использовать условия, сравнивающие уровень способности с нужным значением и... далее есть несколько вариантов реализации, но наиболее подходящий - просто выполнять все последующие действия триггера внутри оператора, а затем создать несколько раз скопировать его для других условий. Хотя, с точки зрения программирования, это не очень хороший вариант.
ответ
отменять постройку юнита если технология уже ап
либо как сразу говорили через ап здания
где каждому твоему зданию будет соответствовать такое же здание но с дополнительным слотом
с продажей юнита открываешь доту и смотришь как там сделан спелл передать предметы у куры
он сделан как раз через продажу юнита
иначе никак
если не нравится пожалуйся богу об этом
или близардам
пусть выпустят новый патч специально для тебя

23

» WarCraft 3 / Система Опыта

Похожие вопросы:

ответ
Melissa:
Пик еври юнит ин 1100 ов позишн ов юнит
утекает группа + точка
Вместо тысячи слов - изучай наработку.
поставил кастомскрипты для удаления группы и группы игроков (destroygroup и destroyforce), но так после первого срабатывания триггера, дальше уже ничего не работает
ответ
нужно всего 20 а не 120 опыта для второго уровня, что за фигня?
Элементарно, Ватсон. В варике при повышении уровня опыт не сбрасывается, а продолжает расти. Т.е. не 0-100, 100-120 и т.д. Если хочешь получить 0-120, тебе придётся обнулять опыт триггером.
награда за уничтожение базовая
Это же золото.
Герою требуется опыта - формула для вычисления требуемого кол-ва опыта для получения уровня. Вычисляется, когда значения в таблице кончились. В твоём случае для 9 уровня начнёт вычислятся, а для получения 8 уровня у тебя требуется 120 опыта.
Набранный опыт героя - формула вычисления опыта, который даётся за убийство монстров. Т.е. 25 опыта за твоего скелета начисляется именно тут.
Таблица Сокращения монстров
т.е на 3% каждый уровень
По 3% за разницу в уровнях, если уровень героя больше уровня монстра. Т.е. герой 5 уровня будет получать на 12% меньше опыта за убийство монстра 1 уровня и на 3% за убийство монстра 4 уровня.
ответ
Diaboliko, xgm.guru/p/blog-nvc123/101422
это про то как вешать всякую фигню на общий таймер
хэш тут нафиг не нужен т.к. таймер 1
ответ
Можно:
  • Создать проект, пройти модерацию и добавить в него ресурс с вакансией — он появится в ленте ресурсов.
  • Написать в свой блог, запись будет в ленте блогов, соответственно.
  • Обратиться сюда (но этот ресурс, вроде, не особо активен.
Но в «Вопросы» писать не надо.
ответ
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.

23

» WarCraft 3 / vJass

Похожие вопросы:

ответ
Sergarr, там не объясняется синтаксис а только примеры юза
вот ссылочки
ответ
Sergey105, проблема в способе хранения а не в вджасс
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
и на будущее
для кода используй форматирование код
а большие куски кода вноси под кат
вот статья про форматирование
ответ
NewToJass, vjass это диалект
он ничего не убирает а лишь дополняет
если в vjass чтото не работает то и в jass это тоже не работает
ответ
В помощь тебе библиотеки(library) и базы данных.
Либы — для обращения по виду library_name.functionName(arguments)
Базы данных — для выделения юниту своих переменных.
С БД может быть момент не совсем понятным, поэтому скидываю пример:
Эта порнография разработана для личного пользования
У меня в коде есть иллюзия использования вжасса. Либа просто для доп табуляции и невостребованых манипуляций на случай импорта. При создании юнита ему присваивается ряд переменных, а номер этих переменных, относящихся к этому юниту, записывается в его(юнита) UnitUserData
library UnitDataBase
    globals
        constant integer       UnitDBSize = 512
        constant integer       UnitDBHeroesStart = 0
        constant integer       UnitDBHeroesUnder = 49
        constant integer       UnitDBUnitsStart = 50//Includes illusions of heroes. Or Should include them at least :P
        constant integer       UnitDBUnitsUnder = 319
        constant integer       UnitDBSummonsStart = 320
        constant integer       UnitDBSummonsUnder = 511
                 integer       UnitDBNextHero = 0
                 integer       UnitDBNextUnit = 50
                 integer       UnitDBNextSummon = 320
                 unit    array UnitDBUnit[UnitDBSize]
                 real    array UnitDBCurrentAnimationSpeed[UnitDBSize]
                 unit    array UnitDBForceAttackTarget[UnitDBSize]
                 integer array UnitDBAffectedByStuns[UnitDBSize]
                 real    array UnitDBMagicResistance[UnitDBSize]
                 real    array UnitDBPhysResistance[UnitDBSize]
                 real    array UnitDBCurrentArmor[UnitDBSize]//This armor does not include agility bonuses. Not used yet :>
                 real    array UnitDBWhiteMovementSpeed[UnitDBSize]
                 real    array UnitDBCurrentCustomSlow[UnitDBSize]
                 real    array UnitDBMagicDamageAmplifier[UnitDBSize]
                 real    array UnitDBPhysDamageAmplifier[UnitDBSize]
                 real    array UnitDBAdditionalHealth[UnitDBSize]//AKA Shield. Healed whenever unit takes damage.
        constant real          GravityAcceleration = 14.//Azeroth, bitch!
                 real    array UnitDBFlyingHeight[UnitDBSize]//Not used yet
                 real    array UnitDBFallingSpeed[UnitDBSize]
                 
                 integer array UnitDBItemUseVariable[UnitDBUnitsStart]//just don't ask
                 item    array UnitDBLastUsedItem[UnitDBUnitsStart]
                 real    array UnitDBCastPointX[UnitDBUnitsStart]
                 real    array UnitDBCastPointY[UnitDBUnitsStart]
                 
                 integer       UnitDBPreviousHero//Used for exitwhen event. Its next minus two.
                 unit    array UnitDBHeroHPBar[UnitDBUnitsStart]
                 unit    array UnitDBHeroMPBar[UnitDBUnitsStart]
                 unit    array UnitDBHeroSPBar[UnitDBUnitsStart]
    endglobals
    
    //Больно жирные для инлайна
    function UnitDBFindNextFreeVariable takes integer i returns integer
        local unit u
            loop
                set  u = UnitDBUnit[i]
                exitwhen u == null or GetUnitTypeId( u ) < 1
                set  i = i + 1
            endloop
        set  u = null
        return i
    endfunction
    
    function UnitDBAddHero takes unit u, real mdef, real armor returns nothing
        local integer i = UnitDBNextHero
        local real x = GetUnitX(u)
        local real y = GetUnitY(u)
            call UnitMakeAbilityPermanent( u, true, 'A00B' )
            set  UnitDBUnit[i] = u
            call SetUnitUserData( u, i )
            call GroupAddUnit( UnitsInPlayableArea, u )
            set  UnitDBItemUseVariable[i] = 0
            set  UnitDBCurrentAnimationSpeed[i] = 0.
            set  UnitDBAffectedByStuns[i] = 0
            set  UnitDBMagicResistance[i] = mdef
            set  UnitDBCurrentArmor[i] = armor
            set  UnitDBWhiteMovementSpeed[i] = GetUnitDefaultMoveSpeed( u )
            set  UnitDBCurrentCustomSlow[i] = 1.
            set  UnitDBMagicDamageAmplifier[i] = 1.
            set  UnitDBPhysDamageAmplifier[i] = 1.
            set  UnitDBFlyingHeight[i] = 0.//Doesn't include point height.
            set  UnitDBAdditionalHealth[i] = 0.
            /*if ( i == UnitDBHeroesUnder ) then
               call BJDebugMsg("|c00ff6060Hero limit reached! More heroes can be created, but things can go wild.")
            endif*/
            set  UnitDBNextHero = i + 1
            set  UnitDBPreviousHero = i - 1
            set  UnitDBHeroHPBar[i] = CreateUnit(BossPlayer1, 'hmil', x, y, 0. )
            call SetUnitAnimationByIndex( UnitDBHeroHPBar[i], 100 )
            set  UnitDBHeroMPBar[i] = CreateUnit( BossPlayer1, 'hrtt', x, y, 0. )
            call SetUnitAnimationByIndex( UnitDBHeroMPBar[i], 100 )
            set  UnitDBHeroSPBar[i] = CreateUnit( BossPlayer1, 'hwt2', x, y, 0. )
            call SetUnitAnimationByIndex( UnitDBHeroSPBar[i], 0 )
        set  u = null
        return
    endfunction

    function UnitDBAddUnit takes unit createdUnit, real mdef, real armor returns nothing
        local integer i = UnitDBNextUnit
        local unit u = UnitDBUnit[i]
            if ( u == null ) then
                set  i = UnitDBFindNextFreeVariable( UnitDBSummonsStart )
            endif
            set  UnitDBUnit[i] = createdUnit
            call SetUnitUserData( createdUnit, i )
            call GroupAddUnit( UnitsInPlayableArea, createdUnit )
            set  UnitDBCurrentAnimationSpeed[i] = 0.
            set  UnitDBAffectedByStuns[i] = 0
            set  UnitDBMagicResistance[i] = mdef
            set  UnitDBCurrentArmor[i] = armor
            set  UnitDBWhiteMovementSpeed[i] = GetUnitDefaultMoveSpeed( createdUnit )
            set  UnitDBCurrentCustomSlow[i] = 1.
            set  UnitDBMagicDamageAmplifier[i] = 1.
            set  UnitDBPhysDamageAmplifier[i] = 1.
            set  UnitDBFlyingHeight[i] = 0.
            set  UnitDBAdditionalHealth[i] = 0.
            if ( i < UnitDBSummonsUnder) then
                set  UnitDBNextSummon = i + 1
            else
                set  UnitDBNextSummon = UnitDBSummonsStart
            endif
        set  u = null
        set  createdUnit = null
        return
    endfunction
    
    function UnitDBAddSummon takes unit summonedUnit, real mdef, real armor returns nothing
        local integer i = UnitDBNextSummon
        local unit u = UnitDBUnit[i]
            if ( u == null ) then
                set  i = UnitDBFindNextFreeVariable( UnitDBSummonsStart )
            endif
            set  UnitDBUnit[i] = summonedUnit
            call SetUnitUserData( summonedUnit, i )
            call GroupAddUnit( UnitsInPlayableArea, summonedUnit )
            set  UnitDBCurrentAnimationSpeed[i] = 0.
            set  UnitDBAffectedByStuns[i] = 0
            set  UnitDBMagicResistance[i] = mdef
            set  UnitDBCurrentArmor[i] = armor
            set  UnitDBWhiteMovementSpeed[i] = GetUnitDefaultMoveSpeed( summonedUnit )
            set  UnitDBCurrentCustomSlow[i] = 1.
            set  UnitDBMagicDamageAmplifier[i] = 1.
            set  UnitDBPhysDamageAmplifier[i] = 1.
            set  UnitDBFlyingHeight[i] = 0.
            set  UnitDBAdditionalHealth[i] = 0.
            if ( i < UnitDBSummonsUnder) then
                set  UnitDBNextSummon = i + 1
            else
                set  UnitDBNextSummon = UnitDBSummonsStart
            endif
        set  u = null
        set  summonedUnit = null
        return
    endfunction
      
    //Система маг резиста была изменена на дефолтную, была введена аналогичная ей система физ урона.
    //Необходимо протестить эти системы на низких значениях. (могучий float и его точность). В нынешних условиях низкие значения не достигаются. На тест положен болт. Есть нерешенные проблемы с точностью(при восстановлении, опять же, резисты съезжают). Необходимо учитывать при вычислениях лишь первые три цифры после запятой, например.
    #define UnitDBIncreaseUnitMagicResistance( amount, userData ) = {
            set  UnitDBMagicResistance[userData] = UnitDBMagicResistance[userData] * amount
    }
    #define UnitDBDecreaseUnitMagicResistance( amount, userData ) = {
            set  UnitDBMagicResistance[userData] = UnitDBMagicResistance[userData] / amount
            if ( UnitDBMagicResistance[userData] > 0.99997 and UnitDBMagicResistance[userData] < 1.00003 ) then
                set  UnitDBMagicResistance[userData] = 1. 
            endif
    }
    #define UnitDBIncreaseUnitPhysResistance( amount, userData ) = {
            set  UnitDBPhysResistance[userData] = UnitDBPhysResistance[userData] * amount
    }
    #define UnitDBDecreaseUnitPhysResistance( amount, userData ) = {
            set  UnitDBPhysResistance[userData] = UnitDBPhysResistance[userData] / amount
            if ( UnitDBPhysResistance[userData] > 0.99997 and UnitDBPhysResistance[userData] < 1.00003 ) then
                set  UnitDBPhysResistance[userData] = 1. 
            endif
    }
    #define UnitDBReplaceUnitMagicResistance( before, after, userData ) = {
            set  UnitDBMagicResistance[userData] = UnitDBMagicResistance[userData] / before * after
    }
    #define UnitDBReplaceUnitPhysResistance( before, after, userData ) = {
            set  UnitDBPhysResistance[userData] = UnitDBPhysResistance[userData] / before * after
    }
    #define UnitDBIncreaseUnitMagicDamageAmplifier( amount, userData ) = {
            set  UnitDBMagicDamageAmplifier[userData] = UnitDBMagicDamageAmplifier[userData] + amount
    }
    #define UnitDBDecreaseUnitMagicDamageAmplifier( amount, userData ) = {
            set  UnitDBMagicDamageAmplifier[userData] = UnitDBMagicDamageAmplifier[userData] - amount
            if ( UnitDBMagicDamageAmplifier[userData] > 0.99997 and UnitDBMagicDamageAmplifier[userData] < 1.00003 ) then
                set  UnitDBMagicDamageAmplifier[userData] = 1. 
            endif
    }
    #define UnitDBIncreaseUnitPhysDamageAmplifier( amount, userData ) = {
            set  UnitDBPhysDamageAmplifier[userData] = UnitDBPhysDamageAmplifier[userData] + amount
    }
    #define UnitDBDecreaseUnitPhysDamageAmplifier( amount, userData ) = {
            set  UnitDBPhysDamageAmplifier[userData] = UnitDBPhysDamageAmplifier[userData] - amount
            if ( UnitDBPhysDamageAmplifier[userData] > 0.99997 and UnitDBPhysDamageAmplifier[userData] < 1.00003 ) then
                set  UnitDBPhysDamageAmplifier[userData] = 1. 
            endif
    }
    #define UnitDBIncreaseUnitShield( amount, userData ) = {
            set  UnitDBAdditionalHealth[userData] = UnitDBAdditionalHealth[userData] + amount
            //redraw
    }
    #define UnitDBDecreaseUnitShield( amount, userData ) = {
            set  UnitDBAdditionalHealth[userData] = UnitDBAdditionalHealth[userData] - amount
            if ( UnitDBAdditionalHealth[userData] < 0. ) then//Perhaps should be typed manually on every use. No need of that atm.
                set  UnitDBAdditionalHealth[userData] = 0.
            endif
            //redraw
    }
    function UnitDBAddUnitsCreatedOnInit takes nothing returns nothing
        local unit u = GetEnumUnit()
            if ( not IsUnitType( u, UNIT_TYPE_HERO ) ) then
                call UnitDBAddUnit( u, 1., 0. )//!!! whatever
            endif
        set  u = null
        return
    endfunction
    
endlibrary
ответ
Steal nerves:
это объявление глобальных переменных, так используются и в обычном редакторе. только, если нужно создать свои, мы заходим в редактор переменных и создаем (хоть мы не видим код, а редактор переменных автоматом тип и название внесет в эту конструкцию, что ты выше написал). А в vjass и cjass мы можем объявлять свои переменные в любом участке кода, все что нужно, так это написать так это тип переменной и название переменной на английском.
пример
globals
тип и название переменной
unit U //пример
endglobals
глобальная переменная в отличии от локальной работает везде: в триггере, коде и др. Для всех игроков вроде общие. Не слышал об этом. Похоже, что, да, придется создавать массивы, чтобы у каждого был свой индекс массива.
чтобы создать массив пишут array
unit array U
для новичков
но нужно понимать, что все эти vjass и cjass - это для удобства, компилятор переведет его в обычный jass: все объявленные переменные в разных кусках перенесет наверх при компиляции, вон та же библиотека добавляет в main (главная функция карты) нужные функции, у структур наблюдаются изменения в имени переменных (добавляются в названии переменных и функции приставки от имени структуры и др) и прочее. Если новичок, бери прочитай мануал, потом что-то не понятно (библиотеки, структуры и др), бери пустую карту, напиши код, сохрани и компилируй код, потом архиватором вытащи j-файл, и в текстовике посмотри, сравни. Единственное что не привычно и сложно - синтаксис, ведь не знаешь, какими правилами и сочетаниями слов использовать, к примеру call можно не писать, вместо if endif скобочки и др.

23

» WarCraft 3 / Выбор москитов

Похожие вопросы:

ответ
z1i2p3:
naxim, Принцып ясен большое спасибо! Но вот новая проблема с поворотом, даммик поворачивается несвоевременно. Что можно сделать?
Не знаю.
К сожалению, таким способом будут работать только башни, улучшенные до Башни Стрелка во время игры. Если изначально на карте стоят Башни Стрелки, они работать не будут. Если надо могу исправить.
Исправил. Теперь Башни Стрелки, поставленные на карту в редакторе будут работать так же, как те, что были улучшены во время игры.
ответ
~16GB:
nvc123,
у меня подобным образом сделаны почти все спелы моей карте и всё ок. Если бы ты сделал карты, в которые хоть кто-то играет, то тебя можно было бы ещё слушать, а так. В доте тоже вон всё на хэше и триггерах и всё ок. Ещё и cjass предлагаешь.

23

» WarCraft 3 / Блокировка урона

Похожие вопросы:

ответ
идем читать статьи
ищем фразы - запретить заклинание, спелл бук, триггеры
ответ
  • Если урон > здоровья, тогда делаешь юнита неуязвимым, запускаешь таймер на 0 сек., по истечению делаешь юнита уязвимым и восстанавливаешь здоровье
  • Если после восстановления здоровье превышает максимальное значение, тогда восстанавливай здоровье не сразу, а, как и в п.1, с помощью таймера

23

» WarCraft 3 / Помогите сделать заклинание

Похожие вопросы:

ответ
Meddin, меняй цели заклинания
всё работает просто у тебя руки не от туда
аффтару
без триггеров никак
делаем пустышку на основе канала
и при касте проверяем является ли цель врагом
если да то наносим урон
если нет то хилим
подробнее можешь прочесть там
ответ
Rасательно вопроса как добавить в книгу заклинаний больше 12 скиллов - можно добавить книгу в книгу и новой книге сделать ещё несколько скиллов и ещё 1 или несколько книг. В каждую книгу можно ещё по книге и так далее.
Главное - ID приказа у всех книг должны быть разные.

Иконки способностей кольца, когтей и т.д. отображаться не будут, ты можешь отображать скиллы-пустышки, а (только это на всякий случай предложенный вариант!) герою выдавать сам предмет, предварительно вытряхнув из его инвентаря все предметы на пол. После добавления в пустой инвентарь нужного предмета, например когтей - заполняем ещё 4 слота предметами-пустышками, затем даём предмет со способностью "предметы герой", у этой способности для предмета должна стоять галочка "относится к предмету", обязательно. После этого инвентарь снова очистится уже сам, однако добавленный предмет на атаку будет иметь эффект. После чего можно подобрать с пола предметы героя и отдать ему триггерно.

Почему не стоит добавлять способность когтей триггерно? - потому что 2 добавленные одинаковые способности не суммируются. Два одинаковых предмета же суммируются.
Есть ли минусы у вышеописанного способа? - скорее всего удалить добавленный бонус нормально не выйдет. Придётся вытряхать инвентарь удалением способности "предметы герой" у самого героя, а это тот ещё геморрой -восстановить потом всё, что должно было остаться неудалённым.
ответ
НЕзаяЦ: ой. спасибо. я делал по памяти. забыл написать что дамми юнита удалить нужно. )
во первых можно переменные можно создавать на джасс. я показал самый простой вариант.
во вторых этими двумя переменными можно пользоваться другими способностями которые, работаеют на освнове канала по похожей схеме.
вот немного переделал. в конце ставим время жизни для дамми юнита, после чего он удаляется. и потом чистим переменные.
ответ
что за костыли блин
событие - приводит способность в действие
условие - применённая способность == божественный щит
действия:
unit u=GetTriggerUnit()
SetUnitVertexColor(u,0,0,0,255)
TriggerSleepAction(15) // здесь указываем время действия способности
SetUnitVertexColor(u,255,255,255,255)
если время действия зависит от уровня то юзай арифметику как писали выше
в твоём случае это 2 + (уровень способности * 2)

23

» WarCraft 3 / как сделать инвентарь ?

Похожие вопросы:

ответ
Я думаю используя руну. Делать предмет в виде руны, отлавливать её использование и проверять предметы в инвентаре. Если есть нужные, то скрещивать, если нет, то создавать новую руну на земле такого же типа.
ответ
отменять постройку юнита если технология уже ап
либо как сразу говорили через ап здания
где каждому твоему зданию будет соответствовать такое же здание но с дополнительным слотом
с продажей юнита открываешь доту и смотришь как там сделан спелл передать предметы у куры
он сделан как раз через продажу юнита
иначе никак
если не нравится пожалуйся богу об этом
или близардам
пусть выпустят новый патч специально для тебя
ответ
Pro100Gaus, посмотри здесь
ответ
Сделать триггер для проверки кода, ну и организовать систему для его считывания и поверь это очень много всего, придется продумать.
Если коротко ты цифрами будешь (условно) сохранять своего героя, каждый набор цифр отвечает за какой то параметр героя, силу, ловкость, уровень, предметы и так далее, когда я говорю что это очень много всего придется продумать так и есть, тебе придется создать базу данных, для всех чисел и все проверять при введении команды, для защиты можно сверять суму чисел и проверять героя за которого играет игрок.
Мой тебе совет, не поленись и вбей в поиск "сделать команду save для карты варкрафт 3", на твое удивление там будет то что тебе нужно, уже на второй ссылке.

23

» WarCraft 3 / Как сделать что бы триггер срабатывал после удара

Похожие вопросы:

ответ
Ох уж эти отловы урона
ответ
Убери Wait во 2 триггере, во-первых.
В 1 триггере поставь действие TurnOn (включить) триггер 2 (на втором триггере нажми правой кнопкой и выбери изначально включён. У тебя вроде как действие Run, я так понимаю, просто у меня на англ WE.
Во втором триггере поставь событие Время Pereodic 0.02 сек.
Сделай условие, если в точке твоего двигаемого юнита тип проходимости Ходьба, то: дальше выключает этот триггер и делаешь другие свои действия, ьам звук добавляешь и т.д.
А вообще, судя по скринам твоих триггеров, ты ещё очень далёк от создания даже триггерных способностей.
Советую, лучше изучи какие бывают События, Действия и Условия, и что они делают.
Мышкоблудка:
Такие сложные вещи лучше наверно на jass делать, хоть это сложнее будет
Ты, конечно, колоссально помог в вопросе, но я открою тебе секрет: ничего тут сложного, на ГУИ изи делается, как и большинство других скилов.

23

» WarCraft 3 / Вопрос по Jass

Похожие вопросы:

ответ
Wyett, ты можешь добавлять подобные этим:
function ... takes ... returns ...
Код
endfunction
Резака купить можно, но это будет абсолютно не похоже на покупку дирижабля.
ответ
Чтобы было норм читать, надо хотя бы выделять содержимое каждого блока (типа function/endfunction, if/endif, loop/endloop) табуляцией. Если блок внутри блока, то двойная табуляция, и т. д.
В vJASS и cJASS не стоит использовать одновременно C-подобный и Turing-подобный (стандартный JASS) синтаксис.
А если ты неправильно поставишь пробелы, запятые или кавычки, тебе об этом скажет парсер =)
ответ
local real x = GetRandomReal(GetRectMinX(GetPlayableMapRect()), GetRectMaxX(GetPlayableMapRect()))
local real y = GetRandomReal(GetRectMinY(GetPlayableMapRect()), GetRectMaxY(GetPlayableMapRect()))
...
(действия с координатами)
...
Любые действия с локейшном можно переделать под координаты, если не используется z-координата, как сказано выше. Но z-координату используют не только лишь все, мало кто может это делать.
И обнулять ничего не придётся, так как действительное число не утекает.
ответ
Во-первых, что есть "локальный таймер" ? Это таймер записанный в локальную переменную?
Во-вторых, зачем тебе точка, если ты используешь XY ? Работай с ними
В-третьих, да. Использование в течении всей игры одной заранее созданной точки вызывает меньше нагрузки чем постоянно создание и удаление новых (кто-то там доказывал на примере и цифрами что от ремувнутых точке всё равно остаётся шлак в памяти...)
ответ
Нет, не утекает. По крайней мере совсем незначительно. Проверенно многими часами)

23

» WarCraft 3 / По ИИ

Похожие вопросы:

ответ
Wyett, ты можешь добавлять подобные этим:
function ... takes ... returns ...
Код
endfunction
Резака купить можно, но это будет абсолютно не похоже на покупку дирижабля.
ответ
Нет, не утекает. По крайней мере совсем незначительно. Проверенно многими часами)
ответ
~8gabriel8:
Карта без тумана войны и чёрной маски? Если с ними, то зачем прозрачность в пределах видимости юнита? Просто всей пещере непрозрачность 15%, и каждую секунду делать проверку, если никаких юнитов игрока нет в пещере, то непрозрачность 100%, если есть, то 15%.
ответ

23

» WarCraft 3 / Помогите найти карту

Похожие вопросы:

ответ
ответ
не знаю даже поищи СТАРЕЙШИХ ИГРОКОВ У ВАРКРАФТА и попроси у них все карты которые они имеют
а дальше пороверь все карты и найди её если не найдёш значит она тебе приснилась)
ответ
ответ
Да, это Starcraft hybrids, если скриншоты похожи на какой-либо фрагмент из этого видео.
ответ
закрыт по таймауту

23

» WarCraft 3 / Пути для тайлсетов?

Похожие вопросы:

ответ
Ты явно написал пути неправильно. Мне плохо видно на таком скрине, но вроде бы там написано villave

23

» WarCraft 3 / Maniac With Saw

Похожие вопросы:

ответ
  1. Думаю, что можно.
Берем основную модель, возможно, вообще без мяса, только с гусеницами, но с кучей точек крепления. Также берем кучу моделей-аттачметов, представляющих собой эти самые пушки, корпуса и все прочее. При выборе характеристик модели через диалог или интерфейс соответственно создаем на основной модели эффекты-аттачменты, будет собрана техника. Такие штуки, как двигатель и прочие невидные извне элементы будут скорее входить в математическую модель юнита, но это также можно запилить. Название танка - сразу не скажу, есть ли триггер на смену, но на таблице рекордов можно отобразить что угодно.

2.Тоже можно.
Создаем погодный в определенной местности и делаем два триггера для контроля входа-выхода юнитов из нее. На искомых юнитов применяем нужные способности - и все готово.

  1. Здесь чуть сложнее: нужно постоянно проверять тип местности под юнитом, но тоже можно. Проверка на ограждения тоже может бить сделана.

4.Это уже интереснее. Видел раньше подобное в играх. При каждой атаке юнита случайным образом наносим или не наносим доп. урон, эффект горения, кидаем спелл на цель в зависимости от теоретического места попадания атаки.

5.И это можно. Но нужно писать нестандартную систему Альянса. Но через триггеры и JASS все можно...

  1. Продажа техники - лучше через способность, что бы кидать ее на понравившегося юнита, не стоит покупать кота в мешке. Стоимость должна зависеть от технического уровня юнита, его текущего состояния (мертвый танк попадет вам бесплатно, сами чините!), если он был модернизован дополнительно, то это тоже входит в стоимость. Разрешение на продажу делаем аналогично.

  1. Это легко через Custom Value и переменние.

Как ты понял, все что ты предложил создать можно, но на это нужно потрать хороший кусок времени. Остается пожелать тебе удачи над созданием проекта - мне идея уже нравится.

23

» WarCraft 3 / Дамми скилл

Похожие вопросы:

ответ
Tobi123:
Офк
Всё, разобрался. По совету nvc123 удалил руссификатор и появилось новое условие "Unit has specific Buff", за что ему огромное спасибо.
ответ
Вобщем озарение как всегда пришло внезапно - понял что GetSpellAbilityUnit срабатывает на дамми и записывает в массив его, а не цель щита. Просто передвинул махинации с дамми в конец функции Actions. Всё отменно работает. Всем спасибо все свободны
ответ
если в гуи то это так (при учёте что способность либо канал либо не из нейтрально пассивных-враждебных ):Боевая единица всё что начинается с Issue Order, там вариантов много пример:
IssueTargetOrder( Gnom, "thunderbolt", Cel), заставит Гнома кинуть молот в цель
ну а если очень хочется использовать такое заклинание как "Пламя обречённости ",то попробуй его запихать в предмет и кастуй уже с него
ответ
ну попробуй так
перед созданием сбрось флаг
set a=GetUnitUIDefByIdCaching(unitid)
if a>0 then
call WMem(a+0xB8,0)
endif
после создания единицу обратно пишешь, должно сработать

23

» WarCraft 3 / Нестандартный размер карты

Похожие вопросы:

ответ
от того что ты создал нестандартное, почти не имеет веса, вес зависит от количества кода(1 буква гдет 1-2 бит, а в байте 8 бит, а в килобайте 1024 байт) и от объектов созданных на карте(декор эффекты юниты области и тд сколько они весят хз но по моему где то 500-1000 байт) (код в гуй объёмен, содержит лишние проверки if и ненужные вызовы "Функции В Функции")
при загрузки карты она имеет свой стандартный вес(код+импорт+объекты на карте), но в процессе игры могут создаваться новые объекты и тп из за чего карта может лагать у кого слабый комп(он тупо не может обрабатывать всю инфу)
Гигамон, возможно в 1 карте ты удалил триг инициализации а в другой нет(стандартный триггер инициализации весь уж точно состоит из 20-30 БЖ функций, которые вызывают другие... я проверял)
ответ
слк оптимизаторы + тула векса
короче поиск по запросу оптимизатор
ответ
попробуй поднять бывшую впадину
если я прав то она вновь станет глубокой впадиной

23

» WarCraft 3 / Угол декорации

Похожие вопросы:

ответ
Отловить приказ постройки и ПОВЕРНУТЬ триггерно.
ответ
воскрешаешь декорацию, делаешь её на 0.1% видимую (можно через анимацию), дальше AddSpecialEffectTarget указываешь твой декор и новую модель
тем самым видеть будут эффект под нужным углом, а атаковать и выделять все ту же декорацию
ответ
Решено, использовал перевод в Jass отсюда xgm.guru/p/wc3/dooandw3etojass, но там в базу пишутся радианы. PS: затея использовать динамический ланд пока жива

23

» WarCraft 3 / Триггерные заклинания

Похожие вопросы:

ответ
Всем спасибо, проблему решил за счет проверки на цвет/номер игрока как индекс в массиве переменных. Все работает как запланировано.
Вопрос вдогонку: как можно задавать сам индекс переменной-массива?)
З.Ы. Массивы конечно зло, но другого способа хранить инфо по одному спеллу, не используя множество переменных - пока не умею.
ответ
Заклинание "Подчинение" или "Очарование"(зависит от перевода) или "Charm" в английской версии.
ответ
Pingvinromeo, проблема в том что ты фигню творишь
если спел применён в точку то точка есть
перемещение это 1 действие
за это время точка не исчезнет
короче пруфы того что не работает
ответ
вариант еще проще
"Aasl (Аура замедления (торнадо))
Эта аура идеально подходит для добавления воину баффа, не имеющего никакого эффекта. Просто замените значения следующих полей в параметрах способности: “Данные – Фактор скорости перемещения” - “0.00” и “Характеристики – Разрешенные цели” - “Сам воин”. У способности нет иконки. Также Вы сможете добавлять боевой единице несколько способностей на основе ‘Aasl’, при этом различные иконки баффов будут сочетаться, а это, несомненно, плюс. Поскольку ‘Aasl’ является повреждающей аурой, то название баффа в игре всегда будет отображаться красным цветом, но Вы можете это изменить, используя в названии код цвета (поле “Текст – Подсказка” в параметрах баффа – прим. alexkill). Например, |cffff0000Повреждающий бафф|r или |cff00ff00Полезный бафф|r. Если же Вы когда-либо найдете предел для ‘Aasl’, то также сможете использовать другие ауры и затем скрывать их в неактивном спеллбуке."
ответ
Вопрос в том, что является целью способности. Если точка, то все должно работать. Если нет то нужно переделать на базе другой способности. Если целевая точка способности не ловится а событие ловится - изменение ландшафта будет в центре карты.
По событию "начинает применять способность" точка должна ловиться например на базе "Волны силы". Далее можно записать координаты и по завершению спелла создать изменения ландшафта в этой точке.
PS Действие вроде д.б. Окружение - Change Terrain type
В спелле на базе "Волны силы" точка ловится и по событию "приводит способность в действие"
Пример для 3 базовых спеллов

23

» WarCraft 3 / multiboard

Похожие вопросы:

ответ
Хз. Вставил твой скрипт- все работает. Может быть у тебя сбилась переменная bj_lastCreatedMultiboard или она ссылается на другой мультиборд? Или у тебя индексы криво иницализированы (0-11), а GetConvertedPlayerId(p) возвращает 1-12. Или может у тебя событие кривое или оно вообще отсутсвует? Короче скинь целиком скрипт.
ответ
варианта без джасс не существует ибо там нужен GetLocalPlayer
готовому коду\наработке
это вопросы/ответы а не стол заказов
по поводу совета могу дать лишь 1
учи jass а ещё лучше сразу vjass и cjass
всеравно без них ничего не сделаешь нормального
а говна и так столько что оно никому не нужно
вот статьи
там можно выучить jass/vjass/cjass
ответ
Sacar777, выведи после MultiboardGetItem(udg_JC_Board, i-1, 1)
на экран следующий текст
I2S(GetHandleId(q1))
I2S(GetHandleId(q2))
если q2 по каким то причинам не создаётся то это скажет об этом
стоп
а какой у тебя размер столбца стоит?
мб просто ячейка q1 перекрывает собой ячейку q2
и размер 10 это очень много
ведь в отличие от гуи тут размер в сотых указывается
то есть если в гуи размер 10 то тут должен быть 0.1
поставь в MultiboardSetItemWidth(q1, 10.00)
вместо 10.00 0.1 и проверь
если 0.1 не сработает то поставь 0.02
если и это не сработает то отпиши сюда
я тогда раскапаю свой старый мультибоард и сравню с твоим
ответ
Sergey105, ты статьи вообще смотрел?
для того чтобы избежать кучи неудобств связанных с обновлением мультибоарда(бегать по коду и искать где что изменяется) умные люди используют инкапсуляцию
ответ
Tapper, не ,не помогает.
Если ты конечно про
//! nocjass

//! endnocjass
В общем, такая проблема возникает только на JNGP Requiem.

23

» WarCraft 3 / Количество текстур

Похожие вопросы:

ответ
Maxsavin:
darkowlom, ну я сабжом расставил нужные текстуры. Из всего что пора пришло в голову только использовать триггер "Окружение" и в нужных местах областями ставить текстуры. Но это как муторно.. Вот и решил спросить можно ли обойти ограничения.
Это делается функциями GetTerrainType и SetTerrainType.
Рисуешь на тех же самых текстурах определенную допустим квадратную локацию.
Затем for стартовоеX до конечноеX внутри for СтартовоеY до КонечноеY если getterraintype = точтонадозаменить то setterraintype на другую текстуру.
Других адекватных методов нет. Триггер который ты привел использует локации (точки), а значит - это возня с точками - возможно утечки.
Я используя эти функ целиком всю карту стираю размера 256x256 и отрисовываю 10к тайлов, в одном проекте). Лаг если и есть во время перерисовки - то незаметный, не больше 0.5сек
ответ
Можно сделать плоскую (или нет) модель с текстурой нужных тайлов и заделывать ландшафт ими (получается иногда даже лучше, чем обычными тайлами)
ответ
в чем вопрос?
ответ
Думаю, тебе нужна ссыль
ответ
100% будет работать, если заменить стандартные текстуры деревьев, а в самих моделях вместо пути к текстуре указать соответствующий Replaceable ID. (Если порченные версии тоже заменить под новую модель, то ещё и порча будет корректно работать =)

23

» WarCraft 3 / Герой который не атакует

Похожие вопросы:

ответ
nvc123, не, ну если реально хочешь знать, то слушай:
Суть скила в том, что герой использует скил и наносит урон, зависящий от его текущего урона. Скил активный. Т.е. в принципе можно сделать так, чтобы герой при активации способности получал приказ атаковать указанную цель и тогда полученный урон можно было бы отловить. Но тогда потом ещё придётся триггерно заставить его и скил применить, чтобы тот перезаряжался. В принципе это вполне реализуем0. Но всё-таки если бы можно было при помощи функции узнать урон, было бы гораздо притнее :)
ответ
События в помощь. Почитайте про событийно-ориентированные языки программирования. Jass является таким
ответ
У вайпера "Corrosive Skin" сделано на событии получения урона выше опред. порога (вроде выше 2.00).
Если охото чтобы именно дебафнуть в момент нанесения тычки, то тут нужно 2 триггера, 1 который следит (юнит атакован) и запускат таймер на скмжем 2 сек.
Второй триггер ждет что кто то (атакуемый или атакующий) сдохнет, время выйдет, атакующий отдаст приказ без указания цели, атакуемый получит урон.
Добавляя атакуемому скилл на основе рунных браслетов (-2.00 фактор резиста) и отсеиваем весь урон от заклинаний (ну наносим его юниту еще раз, но удалив браслеты и снизив хп) а если урон физический и источник урона на наз замахивался,последние 2 сек, + не успел отдать приказ без указания цели то его баффаем.
Если совсем лень, скачиваем систему отлова физического урона.
ответ
Если очень сильно надо - гугли Easy damage system для разъяснений, вот тебе сама система.
ответ
Действие:
Установить количество зарядов предмета = количество зарядов предмета -1.
Если количество зарядов предмета = 0, то удалить предмет.

23

» WarCraft 3 / Не работает модель

Похожие вопросы:

ответ
путь к текстуре прописывать правильно надо
текстура должна хранится в new.mix без подпапок
ответ
либо юзай мдлвиз как все белые люди
ответ
~8gabriel8:
BattleMaster, укажи имена:
BTNBT
DISBTNBT
Потом в редакторе объектов проверь путь к BT, скорее всего надо будет поменять на BTNBT.
ответ
Проблема решена